home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / GRFBLIT.C < prev    next >
C/C++ Source or Header  |  1992-03-27  |  5KB  |  128 lines

  1. /**************************************************************************
  2.  * GRFBLIT.C - grf_memblit() function.
  3.  *************************************************************************/
  4.  
  5. #include "gemfast.h"
  6.  
  7. #ifndef NULL
  8.   #define NULL 0L
  9. #endif
  10.  
  11. static long dmyfdb; /* dummy "fdb" (0L) describes the physical screen */
  12.  
  13. /**************************************************************************
  14.  * grf_blit - blit a rectangle between screen and buffer.
  15.  *************************************************************************/
  16.  
  17. long grf_blit(options, buffer, prect)
  18.     int              options;
  19.     void            *buffer;
  20.     void            *prect;
  21. {
  22.     GRECT           scrnrect;     /* rectangle on the screen               */
  23.     GRECT           memrect;      /* rectangle in memory (x/y always zero) */
  24.     FDB             memfdb;       /* FDB describing memory buffer          */
  25.     register long   wdwidth;      /* width of memory buffer in words       */
  26.     register long   mem_needed;   /* memory needed to do the blit          */
  27.     register FDB    *srcefdb;     /* source FDB pointer                    */
  28.     register FDB    *destfdb;     /* destination FDB pointer               */
  29.     register int    vdi_handle;   /* Handle for temp VDI workstation       */
  30.     struct  {                     /* This is the 'pxy array' used in the   */
  31.             VRECT   srce;         /* VDI blit command; actually two VRECT- */
  32.             VRECT   dest;         /* type rectangles stuck back-to-back    */
  33.             } blitcoords;         /* so it looks like an array.            */
  34.  
  35. /*----------------------------------------------------------------------*
  36.  * validate parms, open a vdi workstation...
  37.  *----------------------------------------------------------------------*/
  38.  
  39.     mem_needed = 0;             /* assume failure */
  40.     
  41.     wind_update(BEG_UPDATE);
  42.  
  43.     if (!(options & (GRF_BFROMSCREEN|GRF_BTOSCREEN|GRF_BMEMCALC))) {
  44.         goto BYPASS_BLIT;
  45.     }
  46.  
  47.     if (prect == NULL || (buffer == NULL && !(options & GRF_BMEMCALC))) {
  48.         goto BYPASS_BLIT;
  49.     }
  50.  
  51.     if (0 == (vdi_handle = apl_vshared())) {
  52.         goto BYPASS_BLIT;
  53.     }
  54.  
  55. /*----------------------------------------------------------------------*
  56.  * get the screen rectangle, clip it to the physical screen...
  57.  *----------------------------------------------------------------------*/
  58.  
  59.     if (options & GRF_BOBJTREE) {
  60.         frm_sizes((OBJECT *)prect, &scrnrect);
  61.     } else{
  62.         rc_copy(prect, &scrnrect);
  63.     }
  64.     
  65.     if (!rc_intersect(&gl_rfscrn, &scrnrect)) {
  66.         goto BYPASS_BLIT;
  67.     }
  68.  
  69. /*----------------------------------------------------------------------*
  70.  * set up the buffer rectangle...
  71.  *----------------------------------------------------------------------*/
  72.  
  73.     memrect.g_x = 0;
  74.     memrect.g_y = 0;
  75.     memrect.g_w = scrnrect.g_w;
  76.     memrect.g_h = scrnrect.g_h;
  77.     
  78. /*----------------------------------------------------------------------*
  79.  * set up the fdb describing the buffer.
  80.  *----------------------------------------------------------------------*/
  81.  
  82.     wdwidth = (scrnrect.g_w + 15) / 16;
  83.  
  84.     memfdb.fd_nplanes = gl_vxout[4];  
  85.     memfdb.fd_stand   = 0;
  86.     memfdb.fd_w       = scrnrect.g_w;
  87.     memfdb.fd_h       = scrnrect.g_h;
  88.     memfdb.fd_wdwidth = wdwidth;
  89.     memfdb.fd_addr    = buffer;
  90.     
  91.     mem_needed = (2 * (wdwidth * (scrnrect.g_h * memfdb.fd_nplanes)));
  92.     
  93.     if ((options & GRF_BMEMCALC) || mem_needed == 0) {
  94.         goto BYPASS_BLIT;
  95.     }
  96.     
  97. /*----------------------------------------------------------------------*
  98.  * do the blit.
  99.  *----------------------------------------------------------------------*/
  100.  
  101.     if (options & GRF_BFROMSCREEN) {
  102.         rc_gtov(&scrnrect, &blitcoords.srce);
  103.         rc_gtov(&memrect,  &blitcoords.dest);
  104.         srcefdb = (FDB *)&dmyfdb;
  105.         destfdb = &memfdb;
  106.     } else {
  107.         rc_gtov(&memrect,  &blitcoords.srce);
  108.         rc_gtov(&scrnrect, &blitcoords.dest);
  109.         srcefdb = &memfdb;
  110.         destfdb = (FDB *)&dmyfdb;
  111.     }
  112.  
  113.     graf_mouse(M_OFF, 0L);
  114.     vro_cpyfm(vdi_handle, S_ONLY, &blitcoords, srcefdb, destfdb);
  115.     graf_mouse(M_ON, 0L);
  116.  
  117. /*----------------------------------------------------------------------*
  118.  * all done, return.
  119.  *----------------------------------------------------------------------*/
  120.  
  121. BYPASS_BLIT:
  122.    
  123.     wind_update(END_UPDATE);
  124.     return mem_needed;
  125. }
  126.  
  127.  
  128.